if (typeof Object.assign != 'function') {
  Object.assign = function(target) {
    'use strict'
    if (target == null) {
      throw new TypeError('Cannot convert undefined or null to object')
    }
    target = Object(target)
    for (var index = 1; index < arguments.length; index++) {
      var source = arguments[index]
      if (source != null) {
        for (var key in source) {
          if (Object.prototype.hasOwnProperty.call(source, key)) {
            target[key] = source[key]
          }
        }
      }
    }
    return target
  }
}

;(function(root) {
  function WxShare(options) {
    this.config = {
      appId: '',
      timestamp: '',
      nonceStr: '',
      signature: ''
    }
    var defaults = {
      title: '',
      des: '',
      linkUrl: '',
      imgUrl: '',
      hasShare: true
    }
    this.options = Object.assign({}, defaults, options)
    this.inviteCode = false
    if (this.options.hasShare) {
      this.getWXConfig()
    }

    if (location.search.indexOf('inviteCode=') > -1) {
      var code = location.search
        .match(/inviteCode=[\w\d]+/g)[0]
        .replace('inviteCode=', '')
      var hostArr = location.hostname.split('.').reverse()
      var hostDomain = hostArr[1] + '.' + hostArr[0]
      this.setCookit('inviteCode', code, Infinity, '/', hostDomain)
    }
  }

  WxShare.prototype = {
    opath: function(path, inviteCode) {
      var pathLen = path.length - 1
      var querySign =
        path.indexOf('?') < 0 ? '?' : path.indexOf('?') === pathLen ? '' : '&'
      return path + querySign + 'inviteCode=' + inviteCode
    },
    getUserCode: function(callback) {
      var _this = this
      var xhr = new XMLHttpRequest()
      xhr.open('get', '/wap/usercount/userCenter')
      xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest')
      xhr.send(null)
      xhr.onreadystatechange = function() {
        if (xhr.readyState === 4) {
          if (xhr.status === 200) {
            var res =
              typeof xhr.responseText === 'string'
                ? JSON.parse(xhr.responseText)
                : xhr.responseText
            if (
              res.result.state === '1' &&
              typeof res.userInfo !== 'undefined'
            ) {
              _this.inviteCode = res.userInfo.inviteCode
            }
            callback &&
              typeof callback === 'function' &&
              callback(_this.inviteCode)
          } else {
            console.log('Error: ' + xhr.status)
          }
        }
      }
    },
    isWX: function() {
      var ua = window.navigator.userAgent.toLowerCase()
      var isWeixin =
        ua.match(/MicroMessenger/i) == 'micromessenger' ||
        ua.match(/_SQ_/i) == '_sq_'
          ? true
          : false

      return isWeixin
    },
    getWXConfig: function() {
      var _this = this
      var formData = new FormData()
      formData.append('url', location.href)
      axios({
        method: 'post',
        url: '/wap/wechat/wxValidate/getJsapiSigna',
        data: formData,
        headers: {
          'X-Requested-With': 'XMLHttpRequest'
        }
      }).then(function(res) {
        _this.config.appId = res.data.appId
        _this.config.timestamp = res.data.timestamp
        _this.config.nonceStr = res.data.noncestr
        _this.config.signature = res.data.signature
        if (_this.isWX()) {
          wx.config({
            debug: false, //开启调试模式,调用的所有api的返回值会在客户端alert出来，若要查看传入的参数，可以在pc端打开，参数信息会通过log打出，仅在pc端时才会打印。
            appId: _this.config.appId, //必填，公众号的唯一标识
            timestamp: _this.config.timestamp, //必填，生成签名的时间戳
            nonceStr: _this.config.nonceStr, //必填，生成签名的随机串
            signature: _this.config.signature, //必填，签名，见附录1
            jsApiList: [
              'onMenuShareAppMessage',
              'onMenuShareTimeline',
              'onMenuShareQQ',
              'onMenuShareWeibo'
            ] //必填，需要使用的JS接口列表，所有JS接口列表见附录2
          })

          _this.getUserCode(function(inviteCode) {
            var linkUrl =
              typeof inviteCode !== 'boolean'
                ? _this.opath(_this.options.linkUrl, inviteCode)
                : _this.options.linkUrl
            _this.on(
              _this.options.title,
              _this.options.des,
              linkUrl,
              _this.options.imgUrl
            )
          })
        }
      })
    },
    on: function(title, des, linkUrl, imgUrl) {
      wx.ready(function() {
        console.log('通过ready接口处理成功验证')
        // config信息验证后会执行ready方法，所有接口调用都必须在config接口获得结果之后，config是一个客户端的异步操作，所以如果需要在页面加载时就调用相关接口，则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口，则可以直接调用，不需要放在ready函数中。
        wx.onMenuShareTimeline({
          //朋友圈
          title: title,
          link: linkUrl,
          imgUrl: imgUrl,
          success: function() {
            // 分享标题 // 分享链接 // 分享图标
            console.log('朋友圈分享成功')
            // 用户确认分享后执行的回调函数
          },
          cancel: function() {
            console.log('朋友圈分享失败')
            // 用户取消分享后执行的回调函数
          }
        })
        wx.onMenuShareAppMessage({
          //微信朋友
          title: title,
          desc: des,
          link: linkUrl,
          imgUrl: imgUrl,
          type: 'link',
          dataUrl: '',
          success: function() {
            // 分享标题 // 分享描述 // 分享链接 // 分享图标 // 分享类型,music、video或link，不填默认为link // 如果type是music或video，则要提供数据链接，默认为空
            console.log('微信朋友分享成功')
            // 用户确认分享后执行的回调函数
          },
          cancel: function() {
            console.log('微信朋友分享失败')
            // 用户取消分享后执行的回调函数
          }
        })
        wx.onMenuShareQQ({
          //分享到QQ
          title: title,
          desc: des,
          link: linkUrl,
          imgUrl: imgUrl,
          success: function() {
            // 分享标题 // 分享描述 // 分享链接 // 分享图标
            console.log('QQ分享成功')
            // 用户确认分享后执行的回调函数
          },
          cancel: function() {
            console.log('QQ分享失败')
            // 用户取消分享后执行的回调函数
          }
        })
        wx.onMenuShareWeibo({
          //分享到腾讯微博
          title: title,
          desc: des,
          link: linkUrl,
          imgUrl: imgUrl,
          success: function() {
            // 分享标题 // 分享描述 // 分享链接 // 分享图标
            console.log('微博分享成功')
            // 用户确认分享后执行的回调函数
          },
          cancel: function() {
            console.log('微博分享失败')
            // 用户取消分享后执行的回调函数
          }
        })
      })
      wx.error(function(res) {
        console.log('通过error接口处理失败验证', res)
        // config信息验证失败会执行error函数，如签名过期导致验证失败，具体错误信息可以打开config的debug模式查看，也可以在返回的res参数中查看，对于SPA可以在这里更新签名。
      })
    },
    setCookit: function(sKey, sValue, vEnd, sPath, sDomain, bSecure) {
      if (!sKey || /^(?:expires|max\-age|path|domain|secure)$/i.test(sKey)) {
        return false
      }
      var sExpires = ''
      if (vEnd) {
        switch (vEnd.constructor) {
          case Number:
            sExpires =
              vEnd === Infinity
                ? '; expires=Fri, 31 Dec 9999 23:59:59 GMT'
                : '; max-age=' + vEnd

            break
          case String:
            sExpires = '; expires=' + vEnd
            break
          case Date:
            sExpires = '; expires=' + vEnd.toUTCString()
            break
        }
      }
      document.cookie =
        encodeURIComponent(sKey) +
        '=' +
        encodeURIComponent(sValue) +
        sExpires +
        (sDomain ? '; domain=' + sDomain : '') +
        (sPath ? '; path=' + sPath : '') +
        (bSecure ? '; secure' : '')
      return true
    },
    getCookie: function(sKey) {
      if (!sKey) {
        return null
      }
      return (
        decodeURIComponent(
          document.cookie.replace(
            new RegExp(
              '(?:(?:^|.*;)\\s*' +
                encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, '\\$&') +
                '\\s*\\=\\s*([^;]*).*$)|^.*$'
            ),
            '$1'
          )
        ) || null
      )
    },
    hasCookie: function(sKey) {
      if (!sKey || /^(?:expires|max\-age|path|domain|secure)$/i.test(sKey)) {
        return false
      }
      return new RegExp(
        '(?:^|;\\s*)' +
          encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, '\\$&') +
          '\\s*\\='
      ).test(document.cookie)
    }
  }
  window.WxShare = WxShare
})(this)
if (typeof module !== 'undefined') {
  module.exports = window.WxShare
}
